package com.dp1.deliversoft.algorithm;

import java.util.ArrayList;

import com.dp1.deliversoft.entidad.*;

public class Utilitario {
	
	public static void DividePedidosGrandes(ArrayList<Pedido> pedidos, ArrayList<Vehiculo> vehiculos)
	{
		int cantPedidosInicial=pedidos.size(),cantPedidosExtra=0,paquetesRestantes=0;
		int idVehiculoLibre;
		Vehiculo v;
		Pedido p_aux,p_actual;
		for (int i=0;i<cantPedidosInicial;i++)
		{
			if (pedidos.get(i).getCantPaquetes()>=Constantes.cantPaquetesAuto)
			{
				cantPedidosExtra=pedidos.get(i).getCantPaquetes()/Constantes.cantPaquetesAuto;
				
				if (cantPedidosExtra==1)
				{
					//elegir vehiculo
					idVehiculoLibre=buscaAutoLibre(vehiculos);
					
					//asociar vehiculo al pedido y visceversa
					if (idVehiculoLibre!=-1)
					{
						pedidos.get(i).setIdVehiculo(idVehiculoLibre);
						v=buscaAuto(vehiculos,idVehiculoLibre);
						v.setEstadoVehiculo(2); //este estado significa asignado
						//marcar como "visitado" el pedido
						pedidos.get(i).setVis(true);
					}
				}
				else
				{
					paquetesRestantes=pedidos.get(i).getCantPaquetes();
					p_actual=pedidos.get(i);
					for (int j=0;j<cantPedidosExtra;j++)
					{
						p_aux=new Pedido(p_actual.getPosX(),p_actual.getPosY(),Math.min(paquetesRestantes, Constantes.cantPaquetesAuto),p_actual.getPlazo(),p_actual.getIdCliente());
						//elegir vehiculo
						idVehiculoLibre=buscaAutoLibre(vehiculos);
						//asociar vehiculo
						if (idVehiculoLibre!=-1)
						{
							pedidos.get(i).setIdVehiculo(idVehiculoLibre);
							v=buscaAuto(vehiculos,idVehiculoLibre);
							v.setEstadoVehiculo(2); //este estado significa asignado
							//marcar como "visitado" el pedido
							p_aux.setVis(true);
						}
						
						paquetesRestantes-=Math.min(paquetesRestantes, Constantes.cantPaquetesAuto);
						pedidos.add(p_aux);
						
					}
					//pueden haber paquetes restantes
					if (paquetesRestantes>0)
					{
						p_aux=new Pedido(p_actual.getPosX(),p_actual.getPosY(),paquetesRestantes,p_actual.getPlazo(),p_actual.getIdCliente());
						p_aux.setVis(false);
						pedidos.add(p_aux);
					}
					p_actual.setVis(true);
				}
			}
		}
	}
	
	public static int buscaAutoLibre(ArrayList <Vehiculo> vehiculos)
	{
		int id=-1;
		for (int i=0;i<vehiculos.size();i++)
			//segun constantes
			if (vehiculos.get(i).getEstadoVehiculo()==Constantes.estVehiculoDisponible && vehiculos.get(i).getTipoVehiculo()==1)
					return vehiculos.get(i).getIdVehiculo();
		return id;
	}
	
	public static Vehiculo buscaAuto(ArrayList <Vehiculo> vehiculos,int id)
	{
		for (int i=0;i<vehiculos.size();i++)
			if (vehiculos.get(i).getIdVehiculo()==id) return vehiculos.get(i);
		
		return null;
	}

}
